'''
Created on 21/09/2013

@author: daniel
'''
import unittest
import arbolBinario.arbolBinario

class FuncionesArbolBinario(arbolBinario.arbolBinario.ArbolBinario):
    '''
    clase arbol binario que se le agregan las funciones pedidas en la practica 4 
    parte 1 ejercicio 4
    '''
    def agregar(self,elem):
        return self.add(FuncionesArbolBinario(elem))
        
    def incluye(self,elem):
        if(self.getObjeto() is elem): return True
        certezai=certezad=False
        if(self.getL()!=None):certezai=self.getL().incluye(elem)
        if(self.getR()!=None):certezad=self.getR().incluye(elem)
        if((certezai==True)|(certezad==True)): return True
        return False
    
    def inOrden(self):
        if(self.getL()!=None): self.getL().inOrden()
        print self.getObjeto()
        if(self.getR()!=None): self.getR().inOrden()
    
    def posOrden(self):
        if(self.getL()!=None): self.getL().inOrden()
        if(self.getR()!=None): self.getR().inOrden()
        print self.getObjeto()
    
    def preOrden(self):
        print self.getObjeto()
        if(self.getL()!=None): self.getL().inOrden()
        if(self.getR()!=None): self.getR().inOrden()

    def getPadre(self,origen):
        if((self.getL()==None)&(self.getR()==None)):return None
        padrei=padred=None
        if(self.getL()!=None):
            if(self.getL().getObjeto()==origen.getObjeto()):return self
            padrei=self.getL().getPadre(origen)
        if(self.getR()!=None):
            if(self.getR().getObjeto()==origen.getObjeto()):return self
            padred=self.getR().getPadre(origen)
        if (padrei!=None):return padrei
        return padred
    

class Test(unittest.TestCase):

    def testInit(self):
        obj=FuncionesArbolBinario(None)
        self.assertIsInstance(obj, FuncionesArbolBinario, "verifica correcta creacion")

    def testAgregar(self):
        obj=FuncionesArbolBinario(1)
        obj.agregar(2)
        self.assertIsNone(obj.getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getObjeto(), 2, "se verifica que agrega elemento")
        self.assertEquals(obj.getR().nodo.getNivel(), 1, "Verifica aumento de nivel")
        obj.agregar(10)
        self.assertIsNone(obj.getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getObjeto(), 10, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().nodo.getNivel(), 2, "Verifica aumento de nivel")
        obj.agregar(7)
        self.assertIsNotNone(obj.getR().getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getObjeto(), 7, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().nodo.getNivel(), 3, "Verifica aumento de nivel")
        obj.agregar(8)
        self.assertIsNotNone(obj.getR().getR().getL().getR(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getR().getObjeto(), 8, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().getR().nodo.getNivel(), 4, "Verifica aumento de nivel")
    
    def testIncluye(self):
        obj=FuncionesArbolBinario(1)
        obj.agregar(2)
        self.assertIsNone(obj.getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getObjeto(), 2, "se verifica que agrega elemento")
        self.assertEquals(obj.getR().nodo.getNivel(), 1, "Verifica aumento de nivel")
        obj.agregar(10)
        self.assertIsNone(obj.getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getObjeto(), 10, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().nodo.getNivel(), 2, "Verifica aumento de nivel")
        obj.agregar(7)
        self.assertIsNotNone(obj.getR().getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getObjeto(), 7, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().nodo.getNivel(), 3, "Verifica aumento de nivel")
        obj.agregar(8)
        self.assertIsNotNone(obj.getR().getR().getL().getR(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getR().getObjeto(), 8, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().getR().nodo.getNivel(), 4, "Verifica aumento de nivel")
        self.assertTrue(obj.incluye(8), "Verifica funcion incluye")
        self.assertFalse(obj.incluye(18), "Verifica funcion incluye")
        
    def testInOrden(self):
        obj=FuncionesArbolBinario(1)
        obj.agregar(2)
        self.assertIsNone(obj.getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getObjeto(), 2, "se verifica que agrega elemento")
        self.assertEquals(obj.getR().nodo.getNivel(), 1, "Verifica aumento de nivel")
        obj.agregar(10)
        self.assertIsNone(obj.getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getObjeto(), 10, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().nodo.getNivel(), 2, "Verifica aumento de nivel")
        obj.agregar(7)
        self.assertIsNotNone(obj.getR().getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getObjeto(), 7, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().nodo.getNivel(), 3, "Verifica aumento de nivel")
        obj.agregar(8)
        self.assertIsNotNone(obj.getR().getR().getL().getR(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getR().getObjeto(), 8, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().getR().nodo.getNivel(), 4, "Verifica aumento de nivel")
        print "In Orden"
        obj.inOrden()
    
    def testPosOrden(self):
        obj=FuncionesArbolBinario(1)
        obj.agregar(2)
        self.assertIsNone(obj.getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getObjeto(), 2, "se verifica que agrega elemento")
        self.assertEquals(obj.getR().nodo.getNivel(), 1, "Verifica aumento de nivel")
        obj.agregar(10)
        self.assertIsNone(obj.getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getObjeto(), 10, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().nodo.getNivel(), 2, "Verifica aumento de nivel")
        obj.agregar(7)
        self.assertIsNotNone(obj.getR().getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getObjeto(), 7, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().nodo.getNivel(), 3, "Verifica aumento de nivel")
        obj.agregar(8)
        self.assertIsNotNone(obj.getR().getR().getL().getR(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getR().getObjeto(), 8, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().getR().nodo.getNivel(), 4, "Verifica aumento de nivel")
        print "Post Orden"
        obj.posOrden()
    
    def testPreOrden(self):
        obj=FuncionesArbolBinario(1)
        obj.agregar(2)
        self.assertIsNone(obj.getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getObjeto(), 2, "se verifica que agrega elemento")
        self.assertEquals(obj.getR().nodo.getNivel(), 1, "Verifica aumento de nivel")
        obj.agregar(10)
        self.assertIsNone(obj.getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getObjeto(), 10, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().nodo.getNivel(), 2, "Verifica aumento de nivel")
        obj.agregar(7)
        self.assertIsNotNone(obj.getR().getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getObjeto(), 7, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().nodo.getNivel(), 3, "Verifica aumento de nivel")
        obj.agregar(8)
        self.assertIsNotNone(obj.getR().getR().getL().getR(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getR().getObjeto(), 8, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().getR().nodo.getNivel(), 4, "Verifica aumento de nivel")
        print "Pre orden"
        obj.preOrden()
        
    def testGetPadre(self):
        obj=FuncionesArbolBinario(1)
        obj.agregar(2)
        self.assertIsNone(obj.getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getObjeto(), 2, "se verifica que agrega elemento")
        self.assertEquals(obj.getR().nodo.getNivel(), 1, "Verifica aumento de nivel")
        obj.agregar(10)
        self.assertIsNone(obj.getR().getL(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getObjeto(), 10, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().nodo.getNivel(), 2, "Verifica aumento de nivel")
        obj.agregar(7)
        self.assertIsNotNone(obj.getR().getR().getL(),"verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().getObjeto(), 7, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().nodo.getNivel(), 3, "Verifica aumento de nivel")
        obj.agregar(8)
        self.assertIsNotNone(obj.getR().getR().getL().getR(),"verifica correcta no insercion")
        self.assertEquals(obj.getR().getR().getL().getR().getObjeto(), 8, "verifica correcta insercion")
        self.assertEquals(obj.getR().getR().getL().getR().nodo.getNivel(), 4, "Verifica aumento de nivel")
        self.assertEquals(obj.getPadre(obj.getR()), obj, "Verifica devolucion de la funcion getpadre")
        self.assertEquals(obj.getPadre(obj.getR().getR()), obj.getR(), "Verifica devolucion de la funcion getpadre")
        self.assertEquals(obj.getPadre(obj.getR().getR().getL()), obj.getR().getR(), "Verifica devolucion de la funcion getpadre")
        self.assertEquals(obj.getPadre(obj.getR().getR().getL().getR()), obj.getR().getR().getL(), "Verifica devolucion de la funcion getpadre")
        self.assertNotEquals(obj.getPadre(obj.getR().getR().getL().getR()), obj.getR().getR(), "Verifica devolucion de la funcion getpadre")
        

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testInit']
    unittest.main()